#ifndef _nkfsdl_timer_h_
#define _nkfsdl_timer_h_

#include "sdl_debug.h"
#include "sdl_layer.h"
#include "SDL.h"
#include <string>
#include <list>

/**
 * \brief uniwersalny czasomierz oparty o SDL
 */

class sdl_timer : public sdl_layer, public sdl_singleton<sdl_timer> {
    long old_ticks; ///<czas w ostatnim takcie
    long new_ticks; ///<czas w bieżącym takcie
    long delta_ms; ///<czas trwania ostatniego taktu w milisekundach

    int a_fps_count; ///<po ilu taktach średniować
    float a_delta; ///<średni czas pomiędzy taktami w sekundach
    std::list<float> a_delta_b; ///<lista czasów trwania ostatnich klatek
    float limit_fps; ///<ograniczenie na liczbę klatek
    float factor; ///<przyspieszenie (bądź spowolnienie)

public:
    sdl_timer(const std::string & n = "timer");
    virtual void update();
    virtual ~sdl_timer();
    ///daj bieżącą ilość klatek na sekundę
    float fps();
    ///daj średnią ilość klatek na sekundę
    float a_fps();
    ///daj czas trwania ostatniej klatki w sekundach
    float dt();
    ///daj średni czas trwania klatki w sekundach
    float a_dt();
    ///ustaw ilość klatek do średniowania
    void set_a_count(int c);
    ///ustaw limit klatek na sekundę (0=brak limitu)
    void set_limit(float l);
    ///ustaw mnożnik (przyspieszenie bądź spowolnienie)
    void set_factor(float f);

private:
    ///uaktualnianie średniego czasu pomiędzy taktami
    void update_a_delta();
    ///czekanie aż czas trwania ramki osiągnie limit
    void wait();
};

///daj bieżącą ilość klatek na sekundę

inline float sdl_timer::fps() {
    return 1.0f / float(delta_ms)*1000.0f;
}

///daj średnią ilość klatek na sekundę

inline float sdl_timer::a_fps() {
    return 1.0f / a_delta;
}

///daj czas trwania ostatniej klatki w sekundach

inline float sdl_timer::dt() {
    return float(delta_ms) / 1000.0f;
}

///daj średni czas trwania klatki w sekundach

inline float sdl_timer::a_dt() {
    return a_delta;
}



#endif //_sdl_timer_h_
